Хотите улучшить этот пост? Дайте подробные ответы на этот вопрос, включая цитаты и объяснение, почему ваш ответ правильный. Ответы с недостаточной детализацией могут быть отредактированы или удалены. Я по ошибке добавил файлы в Git с помощью команды: git добавить myfile.txt Я еще не запускал git commit. Есть ли способ отменить это, чтобы эти файлы не были включены в коммит?
2020-12-07 21:22:07
1 2 следующий Вы можете отменить git add перед фиксацией с помощью git reset <файл> который удалит его из текущего индекса (списка «собирается быть зафиксированным») без каких-либо изменений. Ты можешь использовать git сбросить без имени файла, чтобы отключить все необходимые изменения. Это может пригодиться, когда файлов слишком много, чтобы их можно было перечислить один за другим в разумные сроки. В старых версиях Git приведенные выше команды эквивалентны git reset HEADи git reset HEAD соответственно и завершатся ошибкой, если HEAD не определен (поскольку вы еще не сделали никаких коммитов в своем репозитории) или неоднозначны (потому что создал ветку под названием HEAD, что вы не должны делать). Однако это было изменено в Git 1.8.2, поэтому в современных версиях Git вы можете использовать приведенные выше команды даже до совершения первого коммита: "git reset" (без опций или параметров) используется для вывода ошибки, когда в вашей истории нет никаких коммитов, но теперь это дает вам пустой индекс (чтобы соответствовать несуществующей фиксации, которой вы даже не являетесь). Документация: git reset | Вы хотите: git rm --cached Рассуждение: Когда я был новичком в этом, я сначала попробовал git сбросить. (чтобы отменить все мое первоначальное добавление), только чтобы получить это (не очень) полезное сообщение: фатальный: не удалось определить "HEAD" как действительную ссылку. Оказывается, это потому, что ссылка HEAD (ветвь?) Не существует до момента первого коммита. То есть вы столкнетесь с той же проблемой новичка, что и я, если бы ваш рабочий процесс, как и мой, был примерно таким: cd в каталог моего нового проекта, чтобы опробовать Git, новую популярность git init git add. git статус ... много свитков дерьма от ... => Блин, я не хотел все это добавлять. google "отменить git add" => найти переполнение стека - ура git сбросить. => фатальный: не удалось разрешить "HEAD" как действительную ссылку. Далее выясняется, что в списке рассылки есть ошибка, связанная с бесполезностью этого. И что правильное решение было прямо там, в выводе статуса Git (что, да, я замалчивал как `` дерьмо) ... # Изменения, которые необходимо зафиксировать: # (используйте "git rm --cached ..." для отключения) ... И решение действительно - использовать git rm --cached FILE. Обратите внимание на предупреждения в другом месте - git rm удаляет вашу локальную рабочую копию файла, но не, если вы используете --cached. Вот результат git help rm: --cached Используйте эту опцию для деактивации и удаления путей только из индекса. Файлы рабочего дерева, измененные или нет, останутся. Я продолжаю использовать git rm --cached. удалить все и начать заново. Не получилось, потому что пока доп. рекурсивен, оказывается, что rm требуется -r для рекурсии. Вздох. git rm -r --cached. Хорошо, теперь я вернулся к тому, с чего начал. В следующий раз я собираюсь использовать -n для пробного запуска и посмотреть, что будет добавлено: git add -n. Я заархивировал все в безопасное место, прежде чем доверять git help rm насчет того, что --cached ничего не разрушает (и что, если я ошибся в написании). | Если вы наберете: git статус Git расскажет, что ставится, и т. Д., Включая инструкции по отключению: используйте "git reset HEAD <файл> ...", чтобы отключить Я считаю, что Git довольно хорошо подталкивает меня к правильным поступкам в подобных ситуациях. Примечание. В последних версиях Git (1.8.4.x) это сообщение было изменено: (используйте "git rm --cached <файл> ...", чтобы отключить сцену) | Чтобы уточнить: git add перемещает изменения из текущего рабочего каталога в промежуточную область (индекс). Этот процесс называется постановкой. Итак, наиболее естественная команда для внесения изменений (измененных файлов) очевидна: git stage git add - это просто псевдоним, который легче ввести для стадии git Жаль, что нет команд git unstage и git unadd. Соответствующий труднее угадать или запомнить, но он довольно очевиден: git reset HEAD - Мы можем легко создать для этого псевдоним: git config --global alias.unadd 'reset HEAD -' git config --global alias.unstage 'reset HEAD -' И наконец, у нас есть новые команды: git добавить файл1 git stage file2 git unadd file2 git unstage file1 Лично я использую еще более короткие псевдонимы: git a # Для постановки git u # Для отмены постановки | В дополнение к принятому ответу, если ваш ошибочно добавленный файл был огромным, вы, вероятно, заметите, что даже после удаления его из индекса с помощью «git reset» он по-прежнему занимает место в каталоге .git. Не о чем беспокоиться; файл действительно все еще находится в репозитории, но только как «свободный объект». Он не будет скопирован в другие репозитории (через clone, push), а пространство в конечном итоге будет освобождено - хотя, возможно, не очень скоро. Если вы беспокоитесь, можете бежать: git gc --prune = сейчас Обновление (далее - моя попытка устранить некоторую путаницу, которая может возникнуть из-за ответов, получивших наибольшее количество голосов): Итак, какова настоящая отмена git add? git reset HEAD <файл>? или git rm --cached <файл>? Строго говоря, если не ошибаюсь: нет. git add нельзя отменить - в целом безопасно. Давайте сначала вспомним, что на самом деле делает git add : Если ранее не отслеживался, git add добавляет его вкеш с его текущим содержимым. Если <файл> уже отслеживался, git add сохраняет текущий контент (снимок, версию) в кеш. В Git это действие по-прежнему называется добавить (а не просто обновить его), потому что две разные версии (снимки) файла рассматриваются как два разных элемента: следовательно, мы действительно добавляем новый элемент в кеш, который в конечном итоге совершено позже. В свете этого вопрос несколько двусмысленный: Я по ошибке добавил файлы с помощью команды ... Сценарий OP кажется первым (неотслеживаемый файл), мы хотим «отменить», чтобы удалить файл (а не только текущее содержимое) из отслеживаемых элементов. Если это так, то можно запустить git rm --cached . И мы также можем запустить git reset HEAD . В целом это предпочтительнее, потому что это работает в обоих сценариях: оно также отменяет действие, когда мы по ошибке добавили версию уже отслеживаемого элемента. Но есть два предостережения. Во-первых: существует (как указано в ответе) только один сценарий, в котором git reset HEAD не работает, но git rm --cached работает: новый репозиторий (без коммитов). Но на самом деле это практически не относящийся к делу случай. Во-вторых: имейте в виду, что git reset HEAD не может волшебным образом восстановить содержимое ранее кэшированного файла, он просто повторно синхронизирует его с HEAD. Если наш ошибочный git add перезаписал предыдущую поэтапную незафиксированную версию, мы не сможем ее восстановить. Поэтому, строго говоря, мы не можем отменить [*]. Пример: $ git init $ echo "версия 1"> file.txt $ git add file.txt # Первое добавление file.txt $ git commit -m 'первая фиксация' $ echo "версия 2"> file.txt $ git add file.txt # Этап (не фиксировать) "версия 2" файла file.txt $ git diff --cached file.txt -версия 1 + версия 2 $ echo "версия 3"> file.txt $ git diff file.txt -версия 2 + версия 3 $ git add file.txt # Ой, мы не это имели в виду $ git reset HEAD file.txt # Отменить? $ git diff --cached file.txt # Конечно, без разницы. stage == HEAD $ git diff file.txt # Мы безвозвратно потеряли "версию 2" -версия 1 + версия 3 Конечно, это не очень важно, если мы просто следуем обычному ленивому рабочему процессу, выполняя «git add» только для добавления новых файлов (случай 1), и мы обновляем новое содержимое с помощью команды commit, git commit -a. * (Редактировать: приведенное выше практически правильно, но все же могут быть некоторые слегка хитрые / запутанные способы восстановления изменений, которые были поставлены, но не зафиксированы, а затем перезаписаны - см. Комментарии Йоханнеса Матокича и iolsmit) | Отменить уже добавленный файл довольно просто с помощью Git. Для сброса myfile.txt, который уже был добавлен, используйте: git сбросить HEAD myfile.txt Пояснение: После того, как вы разместили нежелательный файл (ы), чтобы отменить, вы можете выполнить git reset. Head - это голова вашего файла в локальном, а последний параметр - это имя вашего файла. Я создал для вас более подробную информацию о шагах на изображении ниже, включая все шаги, которые могут произойти в этих случаях: | git rm --cached. -р будет рекурсивно «отменить добавление» всего, что вы добавили из текущего каталога | Бегать git gui и удалите все файлы вручную или выбрав их все и нажав кнопку «Отключить от фиксации». | Вопрос четко не поставлен. Причина в том, что git add имеет два значения: добавление нового файла в промежуточную область, а затем отмену с помощью git rm --cached file. добавление измененного файла в промежуточную область, а затем отмену с помощью git reset HEAD file. Если сомневаетесь, используйте git сбросить файл HEAD Потому что в обоих случаях он делает ожидаемую вещь. Предупреждение: если вы выполните команду git rm --cached file для файла, который был изменен (файл, который ранее существовал в репозитории), то файл будет удален при фиксации git! Он по-прежнему будет существовать в вашей файловой системе, но если кто-то еще извлечет вашу фиксацию, файл будет удален из его рабочего дерева. git status сообщит вам, был ли файл новым или измененным: О мастере филиала Изменения, которые необходимо зафиксировать: (используйте "git reset HEAD <файл> ...", чтобы отключить сцену) новый файл: my_new_file.txt изменено: my_modified_file.txt | В Git есть команды для всех мыслимых действий, но ему нужны обширные знания, чтобы все делать правильно, и из-за этого он в лучшем случае нелогичен ... Что ты делал раньше: Изменил файл и использовал git add. Или git add . То, что ты хочешь: Удалите файл из индекса, но оставьте его версионным и оставьте с незафиксированными изменениями в рабочей копии: git reset HEAD <файл> Сбросьте файл в последнее состояние из HEAD, отменив изменения и удалив их из индекса: # Думайте `svn revert <файл>` IIRC. git reset HEAD <файл> git checkout <файл> # Если у вас есть <ветка> с именем типа <файл>, используйте: git checkout - <файл> Это необходимо, поскольку git reset --hard HEAD не работает с отдельными файлами. Удалите из индекса и управления версиями, оставив файл без версий с изменениями в рабочей копии: git rm --cached <файл> Полностью удалите <файл> из рабочей копии и управления версиями: git rm <файл> | Если вы делаете первоначальный коммит и не можете использовать gitсбросить, просто объявите «Git банкротство», удалите папку .git и начните заново | Как и многие другие ответы, вы можете использовать git reset НО: Я нашел этот замечательный небольшой пост, который на самом деле добавляет команду Git (ну, псевдоним) для git unadd: подробности см. В git unadd или .. Просто, git config --global alias.unadd "сбросить HEAD" Теперь вы можете git unadd foo.txt bar.txt | Используйте git add -i, чтобы удалить только что добавленные файлы из предстоящей фиксации. Пример: Добавление файла, который вам не нужен: $ git add foo $ git status # На ветке мастера # Изменения, которые необходимо зафиксировать: # (используйте "git reset HEAD <файл> ...", чтобы отключить сцену) # # новый файл: foo # # Не отслеживаемые файлы: # (используйте "git add ..." для включения в то, что будет зафиксировано) # [...] # Переход в интерактивное добавление для отмены добавления (команды, введенные в git здесь: "r" (возврат), "1" (первая запись в списке показывает возврат), "return" для выхода из режима возврата и "q" (уволиться): $ git add -i поэтапный неэтапный путь 1: + 1 / -0 ничего foo *** Команды *** 1: [s] статус 2: [u] дата 3: [r] evert 4: [a] dd не отслеживается 5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp Что сейчас> г поэтапный неэтапный путь 1: + 1 / -0 ничего [f] oo Назад >> 1 поэтапный неустановленный путь * 1: + 1 / -0 ничего [f] oo Вернуть >> примечание: foo сейчас не отслеживается. вернул один путь *** Команды *** 1: [s] статус 2: [u] дата 3: [r] evert 4: [a] dd не отслеживается 5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp Что сейчас> q До свидания. $ Это оно! Вот ваше доказательство, показывающее, что "foo" снова в списке неотслеживаемых: $ git status # На ветке мастера # Не отслеживаемые файлы: # (используйте "git add ..." для включения в то, что будет зафиксировано) # [...] # foo ничего не добавлено для фиксации, но присутствуют неотслеживаемые файлы (для отслеживания используйте "git add") $ | Для этого можно использовать git remove или git rm с флагом --cached. Пытаться: git help rm | Вот способ избежать этой неприятной проблемы, когда вы начинаете новый проект: Создайте главный каталог для вашего нового проекта. Запустите git init. Теперь создайте файл .gitignore (даже если он пуст). Зафиксируйте свой файл .gitignore. Git сильно усложняет выполнение git reset, если у вас нет никаких коммитов. Если вы создаете крошечную начальную фиксацию только для того, чтобы иметь ее, после этого вы можете git add -A и git reset сколько угодно раз, чтобы все было правильно. Еще одним преимуществом этого метода является то, что если вы позже столкнетесь с проблемами, связанными с окончанием строки, и вам потребуется обновить все ваши файлы, это просто: Взгляните на эту первоначальную фиксацию. Это удалит все ваши файлы. Затем снова проверьте свой последний коммит. Это позволит получить свежие копии ваших файлов с использованием ваших текущих настроек окончания строки. | Возможно, Git изменился с тех пор, как вы разместили свой вопрос. $> git --version git версия 1.6.2.1 Теперь вы можете попробовать: git reset HEAD. Это должно быть то, что вы ищете. | Обратите внимание, что если вы не укажете ревизию, вам необходимо включить разделитель. Пример с моей консоли: git reset <путь_к_файлу> фатальный: неоднозначный аргумент '<путь_к_файлу>': неизвестная версия или путь не в рабочем дереве. Используйте '-' для отделения путей от ревизий git reset - <путь_к_файлу> Неустановленные изменения после сброса: M <путь_к_файлу> (Git версии 1.7.5.4) | Чтобы удалить новые файлы из области подготовки (и только в случае нового файла), как предложено выше: git rm --cached ФАЙЛ Используйте rm --cached только для случайно добавленных новых файлов. | Чтобы сбросить каждый файл в определенной папке (и ее подпапках), вы можете использовать следующую команду: git reset * | Используйте команду * для одновременной обработки нескольких файлов: git сбросить HEAD * .prj git сбросить HEAD * .bmp git сбросить HEAD * gdb * и т.п. | Просто введите git reset, он вернется, как будто вы никогда не набирали git add. с момента вашего последнего коммита. Убедитесь, что вы сделали это раньше. | Предположим, я создаю новый файл newFile.txt: Предположим, я добавляю файл случайно, git add newFile.txt: Теперь я хочу отменить это добавление перед фиксацией, git reset newFile.txt: | Для конкретного файла: git сбросить my_file.txt git checkout my_file.txt Для всех добавленных файлов: git сбросить. git checkout. Примечание: checkout изменяет код в файлах и переходит в последнее обновленное (зафиксированное) состояние. сброс не меняет коды; он просто сбрасывает заголовок. | Чтобы отменить git add, используйте: git сбросить имя файла | Эта команда откроет ваши изменения: git сбросить HEAD filename.txt Вы также можете использовать git add -p добавлять части файлов. | Также есть интерактивный режим: git add -i Выберите вариант 3, чтобы не добавлять файлы. В моем случае я часто хочу добавить более одного файла, а в интерактивном режиме вы можете использовать такие числа для добавления файлов. Это займет все, кроме 4: 1, 2, 3 и 5 Чтобы выбрать последовательность, просто введите 1-5, чтобы взять все от 1 до 5. Промежуточные файлы Git | git add myfile.txt # Это добавит ваш файл в список для фиксации Совершенно противоположно этой команде, git reset HEAD myfile.txt # Это отменитЭто. Итак, вы будете в предыдущем состоянии. Указанный будет снова в неотслеживаемом списке (предыдущее состояние). Он сбросит вашу голову с указанным файлом. так что, если в вашей голове его нет, он просто сбросит его. | git сбросить filename.txt Удалит файл с именем filename.txt из текущего индекса, области «собирается быть зафиксированным», ничего не меняя. | git сбросить filename.txt Удалит файл с именем filename.txt из текущего индекса, области «собирается быть зафиксированным», ничего не меняя. | В Sourcetree вы можете легко сделать это через графический интерфейс. Вы можете проверить, какую команду Sourcetree использует для деактивации файла. Я создал новый файл и добавил его в Git. Затем я отключил его с помощью графического интерфейса Sourcetree. Вот результат: Удаление файлов [12.08.15 10:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q - path / to / file / filename.java Sourcetree использует сброс, чтобы отключить новые файлы. | 1 2 следующий Весьма активный вопрос. Заработайте 10 репутации, чтобы ответить на этот вопрос. Требование репутации помогает защитить этот вопрос от спама и отсутствия ответов. Не тот ответ, который вы ищете? Просмотрите другие вопросы с меткой git version-control git-commit git-stage или задайте свой вопрос.